

export type AttachPointsType='head' |'chest' | 'origin' | 'left-hand' | 'right-hand'

/**自定义id类型 方便各种数据池管理 */
export type IdType= 'EVENT' | 'UNITX' | 'ITEMX' | 'MOVING_UNIT' 


/**
 * 事件类型
 *  CHARGED_UP_IN_NODEF  失去防守的蓄力 （一般指boss发动蓄力技期间的防御架势值丢失状态）
 *  DEFING_CRACK_STARIKE 正处于对崩解打击的防御状态 （指发动特殊技能获的大量防御架势值的状态）
 * 
*/
export type EventType= 'UNIT_MOVE' | 'DOT' | 'BUFF' | 'DEBUFF' | 'CHARGED_UP_WITH_LOSE_DEF' | 'DEFING_CRACK_STARIKE'  | 'COMMON'

/**中毒 燃烧 霜冻 飞行状态 气竭   */
export type Status="Poisoned" | "Burning" | "Frosting" | "Flying" | "Weak" 

export type BuffType= Extract<EventType,'BUFF' | 'DEBUFF'>


/**间隔时间类型  秒 十分之一秒  百分之一秒  毫秒 */
export type IntervalTimeUnit='SECONDS' | 'TENTH_OF_SEC' | 'HUNDRE_OF_SEC' | 'MILL_SEC'


export type ONCE_DMG_DTL={
    /**原始伤害 */
    oriDmg:number,
    /**特效触发频率 */

    /**dot伤害类型 */
    dmgTypeKey:DmgTypeKey,
    /**特效路径 */
    effectPath:string,
    /**附加点 */
    effAttPoint:AttachPointsType,

}


export type FormulaDmgResultType={
    /**是否命中 */
    hit:boolean,
    /**是否暴击 */
    isCri:boolean,
    /**最终非穿甲伤害 */
    defDmg:number,
    /**穿甲伤害 */
    igrDefDmg:number
}





export enum AttrChangeEnum{
    INCREASE,  //增加
    REDUCE //减少
}

/**所有属性的结构体 */
export type UnitAttrStruct={
    /**基础属性 */
    attrs?:UnitAttr,
    /**元素抗性 */
    dtRes?:DmgType,
    /**元素增强 */
    dtEnh?:DmgType

}

/**可以限制数据范围 例如0-100 Enumerate<101> */
export type Enumerate<T extends number, R extends number[] = []> = R['length'] extends T ? R[number] : Enumerate<T, [R['length'], ...R]>


/**二进制属性的key */
export type KeyUnitStatB=keyof Pick<UnitAttr,"atk" | "def" | "aspd" |"hpr" | "str" | "agi" | "int">;


/**hp mp属性的key */
export type KeyUnitStatHpMpKey=keyof Pick<UnitAttr,"hp" | "mp">;

/**从单位属性中选取一些属性 */
//export type PickUnitAttr<K extends keyof UnitAttr>=keyof Pick<UnitAttr,K>


/**基础属性类型 */
export  type UnitAttr={
    atk?:number,   //绿字攻击力 (不包含光环值)
    def?:number,   //绿字防御力 (不包含光环值)
    hp?:number,    //绿字生命
    mp?:number,    //绿字魔法
    aspd?:number,  //绿字攻速 (不包含光环值)
    mov?:number,   //绿字移动 (不包含光环值)
    hpr?:number,   //生命恢复
    mpr?:number,   //魔法恢复

    str?:number,   //坚韧 百分比转换为韧性(boss面对N个玩家的情况倍率会不同) 物理技能穿透抵抗 物理免暴几率
    agi?:number,   //敏锐 防御技巧 (影响完美格挡,防反,闪避的回报收益)  一定命中 一定闪避  一定攻速移速
    int?:number,   //法能 法伤   能量max  法术技能穿透抵抗  法术免暴几率

    /**破招 在破招帧进行削韧打击的附加破招值 */
    bt?:number, 
    /**防御架势  进行主动防御 主动闪避动作  临时获得的防御架势  对破招|削韧打击的防御能力 */
    def_posture?:number, 

    /**韧性 不包含力量部分的韧性  (韧性被削弱至0 会进入破绽状态) */
    tena?:number, 
    /**削韧增幅 */
    dtg_i?:number, //削韧增幅 进行削韧打击时的削韧增幅  1点:1%增幅   与其他削韧增幅计算方式为A类  破招增幅+削韧增幅+其他增幅
    /**削韧抵抗 */
    dtg_r?:number, //削韧抵抗 受到削韧打击时的削韧抵抗  1点:1%抵抗
    /**普攻削韧 */
    dtg_n?:number,  //普攻削韧  普攻能够带出的削韧 （普攻削韧的最主要手段 dtg_i,bt加成此值）

    hit?:number,   //命中 
    flee?:number,  //闪避 不包含敏捷转换部分的闪避 物理+法术
    /**会心 物理,法术暴击 */
    cri?:number,   //会心 物理,法术暴击
    cri_mul?:number, //会心倍率 物理,法术暴击伤害倍率
    r_cri?:number,   //会心抵抗,物理法术 （一般来自力,智之外的途径）
    
    /**技能穿透 技能无视护甲加成百分比  */
    aia?:number,      
    feel?:number,   //感知 对于破绽状态敌人乘法伤害加成  强化成功率 掉率
    steal?:number,   //生命窃取 生命窃取值:生命窃取值*难度系统倍率+ (%0.01*窃取值)*最大生命值修正    
    gb_dmg?:number,   //全局增伤
    gb_rde?:number,   //全局减伤
    // a_skill:{key:"a_skill",name:"主动技能",sdesc:true},  //主动技能
    // p_skill:{key:"p_skill",name:"被动技能",sdesc:true}   //被动技能
}

// declare type XFieldMap<T>={
//     extends keyof T:number;
// }

export type UnitAttrConfig={
    name:string,
    lvl:number,
    aSkill?:string[],
    pSkill?:string[],
} & UnitAttrStruct

export type UnitConfig = {
  name:string,
  lvl:number,
 // learnMaxSkillNum:number    //可学习的最大技能个数(玩家5个 bossN个)
  aSkill?:string[],    //active skill  装备附带的主动技能[考虑从设计上直接优化掉]
  pSkill?:string[],    //passive skill 装备附带的被动技能[考虑从设计上直接优化掉]
} & UnitAttrStruct




export type ItemAttrConfig={
    name:string,
    lvl:number,
    aSkill?:string[],    //active skill  装备附带的主动技能[考虑从设计上直接优化掉]
    pSkill?:string[],    //passive skill 装备附带的被动技能[考虑从设计上直接优化掉]
} & UnitAttrStruct

export type ItemConfig = Record<string,ItemAttrConfig >


/**从元素类型中选取一些属性 */
//export type PickDmgType<K extends keyof DmgType>=keyof Pick<DmgType,K>

/**元素类型 */
export type DmgType={
    fire?:number, //火焰
    ice?:number, //冰霜
    thunder?:number, //雷电
    earth?:number,  //大地
    poison?:number,  //毒 
    dark?:number,    //暗
    death?:number,    //死亡/腐朽
    faith?:number,    //信仰
    all_nphy_ele?:number,  // 除物理以外的全部元素 fire,ice,...faith
    nothing?:number,    //无属性 一般指代所有物理
}

/**元素类型key */
export type DmgTypeKey= keyof DmgType


export type XAbilityExclusive={
    lastedTime?:number
  }


  export type  XAbilityTrgType=keyof XAbilityTrgTypeInfo

  export type XAbilityTrgTypeInfo={
    reduce_tena:'削韧(攻击者降低了目标韧性的动作)'
    brk_tena:'破韧（攻击者将目标韧性打空至衰竭状态）',
    brk_action:'破招（攻击者崩解技打断目标动作）',
    god_def:'神御(防御者完美防御崩解技)',
    rebound_arrow:'飞矢反弹(攻击者崩解技反弹投射物)',
    flee:'闪避',
    cri:'暴击',
  }
  
  
 


  /**
   * reboundProb:反弹几率
   * dmgCRatio:弹反后箭矢伤害改变系数
   * breakOnly:仅中止箭矢飞射不进行反弹(判断优先级低于反弹 注意设值方式) 
   * 
   * 
   * */
  type ReboundArrowAttr={reboundProb:number,dmgCRatio:number,breakOnly?:boolean}

  /**箭矢弹反属性类型
   * selfCenter：是否以自己为圆心  指代aunitx
   * radius:判断半径
   * 
   */
  export type ReboundArrowDtl=({selfCenter:true,radius:number} & ReboundArrowAttr)  | ({selfCenter:false,x:number,y:number,radius:number} & ReboundArrowAttr)


//   export type CrackDefDtl={pfDefTypeKey?:DmgTypeKey}


  export type PlayerRewardUIInfo={
    playerIndex:number, //奖励玩家索引1-N
    consumerEvent:any,  //循环执行面板呼出的事件管理器  方便管理队列问题
    groupDtls:RewardUIDtl[][],
    waitForPlayerSelect:boolean  //上一个战利品玩家还没有选择完标记
  }




//   export type GroupRewardUIDtl=RewardUIDtl[]

export type RewardUIDtl={
  rewardTtile:string, //战利品标题
  rewardDesc:string, //战利品描述
  //rewardLvl:number, //战利品等级
  rareDesc:string, //战利品稀有度描述 1-5星
  iconPath?:string, //图标路径
  callback:Function //奖励执行回调
}










